home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mission 3
/
Mission 3.zip
/
Mission 3.iso
/
zugabe
/
va45
/
visual45
/
library
/
extend
/
objcedit.s
< prev
next >
Wrap
Text File
|
1998-09-06
|
20KB
|
834 lines
;------------------------------------------------------------------------------
; Method name : -
; Asm label : GWVA_WFORM_PRG_OBJC_EDIT
; Description : Réécriture de la fonction AES objc_edit
;
; in : a0.l = adresse de l'arbre ressource
; in : d0.w = numéro de l'objet qui a le focus d'édition
; in : d1.w = touche à traiter (venant d'un form_keybd)
; in : d2.w = index courant de la position du curseur dans le champ texte
; in : d3.w = mode (1,2,3) + mode étendu (4,5=4 moins le curseur)
; out : -> retour dans les int_out (compatibilité pour le retour)
; out : int_out+1*2 : nouvelle position curseur
; out : int_out+2*2 : état de sortie : bit 0 : sortie caractère à droite,
; bit 1 : rentrée caractère à droite,
; bit 2 : sortie curseur à droite,
; bit 3 : sortie curseur à gauche.
; out : int_out+3*2 : caractère éventuel en sortie, 0.w sinon
;
; 22/08/98 : Création
;------------------------------------------------------------------------------
GWVA_WFORM_PRG_OBJC_EDIT:
clr.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE
clr.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR
tst d3
ble .pas_un_mode_valide
cmp.w #4,d3
bgt .pas_un_mode_valide
move.w d0,d4
mulu #L_OBJECT,d4
lea (a0,d4.l),a2
move.w ob_type(a2),d4
and.w #$ff,d4
cmp.w #G_FTEXT,d4
beq.s .texte_editable
cmp.w #G_FBOXTEXT,d4
bne.s .pas_texte_editable_connu
.texte_editable:
move.l ob_spec(a2),a1
cmp.w #3,d3
beq .efface_curseur ; on peut effacer le curseur d'un objet
; FTEXT disable (changement d'état)
btst #EDITABLE,ob_flags+1(a2)
beq.s .pas_objet_editable
btst #DISABLED,ob_state+1(a2)
bne.s .objet_disable
cmp.w #1,d3
beq .affiche_curseur
move.w d3,GWVA_WFORM_OBJ_OBJC_EDIT_MODE ; l'objc_edit est réentrant, mais
cmp.w #2,d3
beq.s .traite_touche
cmp.w #4,d3
beq.s .traite_touche_speciale
clr.w int_out+3*2
move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR,int_out+3*2+1
clr.w int_out+2*2
move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE,int_out+2*2+1
move.w d2,int_out+1*2
move.w #1,d0
move.w d0,int_out
rts
.objet_disable:
.pas_objet_editable:
.pas_texte_editable_connu:
.pas_un_mode_valide:
.pas_de_curseur_affiche:
.pas_touche_ascii:
.unknown_char:
clr.w int_out+3*2
move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR,int_out+3*2+1
clr.w int_out+2*2
move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE,int_out+2*2+1
move.w d2,int_out+1*2
move.w #0,d0
move.w d0,int_out
rts
*-----------------------*
.traite_touche_speciale:
.traite_touche:
move.w #-1,d3 ; d3 : sens du déplacement
cmp.w #$4b00,d1 ; flêche gauche
beq .deplacement_curseur
move.w #1,d3
cmp.w #$4d00,d1 ; flêche droite
beq .deplacement_curseur
cmp.w #$011b,d1 ; Esc
beq .touche_escape
cmp.w #$0e08,d1 ; Backspace
beq .touche_backspace
cmp.w #$537f,d1 ; Del
beq .touche_del
tst.b d1
beq.s .pas_touche_ascii
; C'est une touche normale
save.l d0-d1/a0-a2
move.l a2,a0 ; objet
move.b d1,d0 ; charactère
move.w d2,d1 ; position d'insertion
move.w d2,GWVA_WFORM_OBJ_CURSOR_POS_TEXT ; position curseur à effacer
move.w GWVA_WFORM_OBJ_OBJC_EDIT_MODE,d2
bsr GWVA_WFORM_PRG_INSERT_CHAR_IN_EDITABLE_TEXT
move.b d1,GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE ; condition de sortie
move.b d2,GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR ; caractère éventuel en sortie
move.w d0,d2 ; d2.w nouvelle position curseur
load.l d0-d1/a0-a2
tst.w d7
bne.s .pas_insertion_char
bsr .affichage_champ_texte
move.w int_out+1*2,d2
.pas_insertion_char;
.pas_del_possible:
.pas_backspace_possible:
clr.w int_out+3*2
move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR,int_out+3*2+1
clr.w int_out+2*2
move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE,int_out+2*2+1
move.w d2,int_out+1*2
move.w #1,d0
move.w d0,int_out
rts
.touche_del:
move.w d2,GWVA_WFORM_OBJ_CURSOR_POS_TEXT ; position curseur à effacer
move.l te_ptext(a1),a3
move.l a3,a4
add.w d2,a3
tst.b (a3)
beq .pas_del_possible ; fin du texte éditable
STOP_ON_0 a4
sub.l te_ptext(a1),a4
move.w a4,d3
add.w #1,d3 ; longueur du texte éditable
move.b (a3),d4 ; caractère effacé par le del
* clr.w d4 ; caractère effacé par le del
cmp.w te_txtlen(a1),d3
bne.s .pas_entree_caractere_droite
cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
bne.s .pas_mode_speciale4_3
bset #1,GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE ; entrée à droite
.pas_mode_speciale4_3:
.pas_entree_caractere_droite:
.decalage_char_del:
move.b 1(a3),(a3)+
tst.b (a3)
bne.s .decalage_char_del
move.b d4,GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR
; pas de changement de position du curseur
bsr .affichage_champ_texte
clr.w int_out+3*2
move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR,int_out+3*2+1
clr.w int_out+2*2
move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE,int_out+2*2+1
move.w #1,d0
move.w d0,int_out
rts
.touche_backspace:
move.w d2,GWVA_WFORM_OBJ_CURSOR_POS_TEXT ; position curseur à effacer
tst.w d2
beq.s .test_obj_edit_extd_backspace
move.l te_ptext(a1),a3
move.l a3,a4
add.w d2,a3
sub.w #1,a3
STOP_ON_0 a4
sub.l te_ptext(a1),a4
move.w a4,d3
add.w #1,d3 ; longueur du texte éditable
cmp.w te_txtlen(a1),d3
bne.s .pas_entree_caractere_droite2
cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
bne.s .pas_mode_speciale4_5
bset #1,GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE ; entrée à droite
.pas_mode_speciale4_5:
.pas_entree_caractere_droite2:
.decalage_char_backspace:
move.b 1(a3),(a3)+
tst.b (a3)
bne.s .decalage_char_backspace
sub.w #1,d2 ; on recule le curseur
bsr .affichage_champ_texte
clr.w int_out+3*2
clr.w int_out+2*2
move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE,int_out+2*2+1
move.w #1,d0
move.w d0,int_out
rts
.test_obj_edit_extd_backspace:
cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
bne .pas_backspace_possible
move.w d1,int_out+3*2 ; bakspace en sortie
clr.w int_out+2*2
bset #3,int_out+2*2+1 ; le curseur sort à gauche
bset #1,int_out+2*2+1 ; un caractère doit rentrer à droite du champ précédent
move.w d2,int_out+1*2
move.w #1,d0
move.w d0,int_out
rts
.touche_escape:
move.l te_ptext(a1),a3 ; pour vider le champ, on place un 0.b en début
clr.b (a3)
move.w d2,GWVA_WFORM_OBJ_CURSOR_POS_TEXT ; position curseur à effacer
moveq #0,d2 ; position du curseur
bsr .affichage_champ_texte ; int_out+1*2 bien positioné pour le curseur
clr.w int_out+3*2
clr.w int_out+2*2
move.w #1,d0
move.w d0,int_out
rts
.affichage_champ_texte:
save.l d0/d2/a0-a2
cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
beq.s .pas_effacement_curseur_en_mode_4
movem.l (sp),d0/d2/a0-a2
move.w GWVA_WFORM_OBJ_CURSOR_POS_TEXT,d2 ; position curseur à effacer
move.w #3,d3
bsr GWVA_WFORM_PRG_OBJC_EDIT ; efface curseur
.pas_effacement_curseur_en_mode_4:
wind_update #BEG_UPDATE
graf_mouse #M_OFF
movem.l (sp),d0/d2/a0-a2
objc_offset a0,d0 ; position de l'objet
movem.l (sp),d0/d2/a0-a2
objc_draw a0,d0,#1,int_out+1*2,int_out+2*2,ob_width(a2),ob_height(a2) ; affichage de l'objet texte
graf_mouse #M_ON
wind_update #END_UPDATE
load.l d0/d2/a0-a2
cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
beq.s .pas_affichage_curseur_en_mode_4
; numéro de l'objet contenant le curseur dans d0.w
; position du cuseur dans d2.w
move.l te_ptext(a1),a3 ; pour positionner le curseur, on place un 0.b
add.w d2,a3
move.b (a3),-(sp)
clr.b (a3)
save.l a3
move.w #1,d3 ; on affiche le curseur
bsr GWVA_WFORM_PRG_OBJC_EDIT
load.l a3
move.b (sp)+,(a3)
move.w int_out+1*2,d2 ; position du curseur dans le champ éditable
.pas_affichage_curseur_en_mode_4
move.w #1,d0
move.w d0,int_out
move.w d2,int_out+1*2 ; position du curseur
rts
.deplacement_curseur:
move.w d2,GWVA_WFORM_OBJ_CURSOR_POS_TEXT ; position curseur à effacer
add.w d3,d2
bpl.s .position_positive
cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
bne.s .pas_mode_speciale4_1
bset #3,GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE ; sortie à gauche
.pas_mode_speciale4_1:
moveq #0,d2
.position_positive:
save.l d0/d2/a0-a1
bsr GWVA_RSC_PRG_RETURN_POSITIONS_CURSOR_TXT ; -> retour dans d0, d1, d2
load.l d0/d2/a0-a1
cmp.w d2,d1 ; d1.w : position max courante du curseur
bge.s .curseur_dans_le_champ
cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
bne.s .pas_mode_speciale4_2
bset #2,GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE ; sortie à droite
.pas_mode_speciale4_2:
move.w d1,d2 ; curseur au bout du champ de texte
.curseur_dans_le_champ:
cmp.w GWVA_WFORM_OBJ_CURSOR_POS_TEXT,d2
beq.s .pas_de_changement_position_curs
cmp.w #4,GWVA_WFORM_OBJ_OBJC_EDIT_MODE
beq.s .pas_effacement_affichage_curseur
save.l d0/d2/a0-a1
move.w GWVA_WFORM_OBJ_CURSOR_POS_TEXT,d2 ; position curseur à effacer
move.w #3,d3 ; on efface le curseur
bsr GWVA_WFORM_PRG_OBJC_EDIT
load.l d0/d2/a0-a1
move.l te_ptext(a1),a3
add.w d2,a3
move.b (a3),-(sp)
clr.b (a3) ; on met un 0.b pour placer le curseur ou l'on veut
save.l a3
move.w #1,d3 ; on affiche le curseur
bsr GWVA_WFORM_PRG_OBJC_EDIT
load.l a3
move.b (sp)+,(a3)
move.w int_out+1*2,d2 ; nouvelle position du curseur
.pas_effacement_affichage_curseur:
.pas_de_changement_position_curs:
clr.w int_out+3*2
clr.w int_out+2*2
move.b GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE,int_out+2*2+1
move.w d2,int_out+1*2
move.w #1,d0
move.w d0,int_out
rts
*-----------------------*
.efface_curseur:
move.w d2,GWVA_WFORM_OBJ_CURSOR_POS_TEXT ; position du curseur à effacer
save.w d0 ; numero de l'objet
bsr GWVA_RSC_PRG_RETURN_POSITIONS_CURSOR_TXT ; -> retour dans d0, d1, d2
bra.s .affiche_efface_curseur
*-----------------------*
.affiche_curseur:
save.w d0 ; numéro de l'objet
bsr GWVA_RSC_PRG_RETURN_POSITIONS_CURSOR_TXT ; -> retour dans d0, d1, d2
; d0 : position du curseur dans l'objet texte
; d1 : position du curseur dans le champ editable
; d2 : longueur du champ texte
move.w d0,GWVA_WFORM_OBJ_CURSOR_POS_TEXT ; position du curseur à afficher
.affiche_efface_curseur:
move.w GWVA_ROOT_SYSTEM_LARGEFONT_CELL_WIDTH,d3
move.w GWVA_ROOT_SYSTEM_LARGEFONT_CELL_HEIGHT,d4
cmp.w #5,te_font(a1) ; small font ?
bne.s .pas_de_small_font
move.w GWVA_ROOT_SYSTEM_SMALLFONT_CELL_WIDTH,d3
move.w GWVA_ROOT_SYSTEM_SMALLFONT_CELL_HEIGHT,d4
.pas_de_small_font:
move.w GWVA_WFORM_OBJ_CURSOR_POS_TEXT,d0
mulu d3,d0 ; position en x du curseur par rapport au début du texte
mulu d3,d2 ; taille du text en pixel
load.w d5 ; numéro de l'objet texte
save.l d0-d4/a0-a2
objc_offset a0,d5
load.l d0-d4/a0-a2
move.w int_out+1*2,d5 ; position x de l'objet texte
cmp.w #0,te_just(a1) : justification gauche ?
beq.s .justified_left
cmp.w #1,te_just(a1) : justification droite ?
bne.s .not_justified_right
move.w ob_width(a2),d6
sub.w d2,d6
add.w d6,d5
.not_justified_right:
cmp.w #2,te_just(a1) : justification centrée ?
bne.s .not_justified_center
move.w ob_width(a2),d6
sub.w d2,d6
asr.w #1,d6
add.w d6,d5
.not_justified_center:
.justified_left:
; -> d5 : position x du debut du texte en pixel
move.w int_out+2*2,d6 ; position y de l'objet texte
move.w ob_height(a2),d7
sub.w d4,d7
asr.w #1,d7
add.w d7,d6
; -> d6 : position y du texte en pixel
add.w d0,d5 ; position x du curseur
move.w d6,d7
sub.w #3,d6 ; position y1 du curseur
add.w d4,d7
add.w #2,d7 ; position y2 du curseur
; Recherche du décalage 3D
cmp.w #$340,global+_AESversion
blt.s .pas_AES340
move.w ob_flags(a2),d0
btst #9,d0
beq.s .pas_objet_indicateur_activateur
save.w d1/d5-d7
; On demande le nombre de pixel pour la 3D
objc_sysvar #0,#6,#0,#0
load.w d1/d5-d7
move.w int_out+1*2,d2
move.w int_out+2*2,d3
sub.w d2,d5 ; décalage du curseur en X (3D)
* sub.w d3,d6 ; décalage du curseur en Y (3D)
* sub.w d3,d7
.pas_objet_indicateur_activateur:
.pas_AES340:
; position/taille bureau
movem.w ([GWVA_ROOT_PTR_WAPP.l],GWVA_WIND_OBJ_INT_DX),d0/d2/d3/d4
add.w d0,d3
add.w d2,d4
sub.w #1,d3
sub.w #1,d4
cmp.w d0,d5
blt .a_gauche_bureau
cmp.w d3,d5
bgt .a_droite_bureau
cmp.w d2,d7
blt .en_haut_bureau
cmp.w d4,d6
bgt .en_bas_bureau
cmp.w d2,d6
bge .haut_curseur_dans_ecran
move.w d2,d6
.haut_curseur_dans_ecran:
cmp.w d4,d7
ble .bas_curseur_dans_ecran
move.w d4,d7
.bas_curseur_dans_ecran:
save.w d1/d5-d7
wind_update #BEG_UPDATE
graf_mouse #M_OFF
vsl_type #0 ; plein
vsl_ends #0,#0 ; bouts carres
vsl_color #0 ; noir
vsl_width #1 ; taille 1
vswr_mode #3 ; xor
load.w d1/d5-d7
move.w d5,ptsin+0*2
move.w d6,ptsin+1*2
move.w d5,ptsin+2*2
move.w d7,ptsin+3*2
save.w d1
v_pline #2
graf_mouse #M_ON
wind_update #END_UPDATE
load.w d1
.a_gauche_bureau:
.a_droite_bureau:
.en_haut_bureau:
.en_bas_bureau:
move.w d1,int_out+1*2 ; position du curseur dans le champ texte
move.w #1,d0
move.w d0,int_out
rts
BSS
GWVA_WFORM_OBJ_CURSOR_POS_TEXT: ds.w 1
GWVA_WFORM_OBJ_OBJC_EDIT_MODE: ds.w 1
GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_STATE: ds.b 1
GWVA_WFORM_OBJ_OBJC_EDIT_EXTD_CHAR: ds.b 1
TEXT
;-----------------------------------------------------------------------------
GWVA_WFORM_PRG_INSERT_CHAR_IN_EDITABLE_TEXT:
; a0.l : ptr sur l'objet GEM texte éditable
; d0.b : charactère ascii
; d1.w : position du curseur (insertion)
; d2.w : mode d'insertion (2 : identiqe GEM, 4 : mode étendu)
; -> d0.w : nouvelle position curseur
; d1.w : état de sortie : bit 0 : sortie caractère à droite,
; bit 1 : rentrée caractère à droite,
; bit 2 : sortie curseur à droite,
; bit 3 : sortie curseur à gauche.
; d2.w : caractère éventuel en sortie, 0.w sinon
; d7.w : code d'erreur
move.w d2,d3 ; sauve le mode d'insertion
move.l ob_spec(a0),a1
move.l te_ptext(a1),a2 ; le texte editable
move.l te_pvalid(a1),a3 ; la chaine de validité
tst.w d1 ; d1.w : position du curseur
beq.s .curseur_debut_texte
add.w d1,a2
add.w d1,a3
move.w te_txtlen(a1),d2 ; d2.w : longueur max du texte + 0.b
sub.w #1,d2
cmp.w d1,d2
bne.s .curseur_pas_en_fin_texte
cmp.w #4,d3 ; pas d'insertion de caractère sur la dernière position d'un champ
beq .caractere_insere_sortie
sub.w #1,d1
lea -1(a2),a2 ; si le curseur est en fin de texte (après le dernier
lea -1(a3),a3 ; caractère), on positione le curs. 1 char. avant
.curseur_pas_en_fin_texte:
.curseur_debut_texte:
; lors de l'appui sur une touche, si le caractère est le prochain caractère de
; la chaine de masque de texte, alors le texte editable est effacé jusqu'à ce texte
; non éditable
move.b (a2),-(sp) ; on veut le texte jusqu'au curseur
clr.b (a2)
save.l d0-d1/d3/a0-a3
bsr GWVA_RSC_PRG_RETURN_POSITIONS_CURSOR_TXT
move.w d0,d2 ; position du curseur dans l'objet texte
load.l d0-d1/d3/a0-a3
move.b (sp)+,(a2)
lea GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT-2,a5
add.w d2,d2 ; [type de caractère,caractère]
add.w d2,a5 ; au niveau du curseur
.recherche_text_tmpl:
lea 2(a5),a5
cmp.b #'_',1(a5)
beq.s .recherche_text_tmpl
tst.b 1(a5)
beq.s .pas_de_texte_non_editable ; fin du texte ?
cmp.b #'_',1+2(a5) ; c'est la condition sine qua non
bne.s .pas_de_texte_editable_apres
cmp.b 1(a5),d0
bne.s .pas_le_caractere_voulue
sub.l #GWVA_WFORM_OBJ_INTERMEDIAIRE_TEXT,a5
move.w a5,d4
sub.w d2,d4 ; nombre de caractère à effacer
lsr #1,d4
sub.w #1,d4
move.l te_ptext(a1),a3 ; le texte editable
add.w te_txtlen(a1),a3 ; longueur max du texte + 0.b
sub.w #1,a3
.efface_texte_editable:
cmp.l a2,a3
beq.s .fin_efface_texte_editable
move.b #' ',(a2)+
addq.w #1,d1
dbf d4,.efface_texte_editable
.fin_efface_texte_editable:
clr.b (a2)
bra .insertion_espace ; le caractère inséré ne tient pas
; compte du masque
.pas_le_caractere_voulue:
.pas_de_texte_editable_apres:
.pas_de_texte_non_editable:
clr.w d2
move.b d0,d2 ; d2.w caractère à insérer
; On teste le caractère de validiter à l'emplacement d'insertion
cmp.b #'9',(a3)
beq .digit
cmp.b #'A',(a3)
beq .uppercase_letter
cmp.b #'a',(a3)
beq .upper_lowercase_letter
cmp.b #'N',(a3)
beq .digit_uppercase_letter
cmp.b #'n',(a3)
beq .digit_upper_lowercase_letter
cmp.b #'X',(a3)
beq .all_chars
cmp.b #'z',d0
bgt .pas_change_lower_upper_name
cmp.b #'a',d0
blt.s .pas_change_lower_upper_name
and.b #$df,d0 ; les charactères GEMDOS sont majuscules
.pas_change_lower_upper_name:
cmp.b #'x',(a3)
beq .all_chars_in_upper
cmp.b #'F',(a3)
beq .GEMDOS_name_1
cmp.b #'f',(a3)
beq .GEMDOS_name_2
cmp.b #'P',(a3)
beq .GEMDOS_pathname_1
cmp.b #'p',(a3)
beq .GEMDOS_pathname_2
bra .unknown_char
.all_chars_in_upper:
.all_chars: ; ce cas correspond à tous les caractères admissibles
.insere_chars:
move.w te_txtlen(a1),d2
sub.w #1,d2
beq .pas_insertion_chars ; taille nulle du texte
move.b (a2),d4 ; caractère à sauvegarder
sub.w #1,d2
beq .insertion_un_seul_char ; pas de décalage
move.l te_ptext(a1),a3
add.w d2,a3 ; adresse de fin d'insertion
move.l a3,d2
sub.l a2,d2 ; nombre de caractère à décaler
move.l te_ptext(a1),a4
STOP_ON_0 a4
sub.l te_ptext(a1),a4
move.w a4,d5
add.w #1,d5 ; longueur du texte éditable
clr.w d4 ; pas de caractère en sortie
cmp.w te_txtlen(a1),d5
bne.s .pas_de_sortie_caractere
move.b (a3),d4 ; caractère à sauvegarder
.pas_de_sortie_caractere:
sub.w #1,d2
bmi.s .pas_decalage_un_seul_char ; condition jamais rencontrée
.decale_chars:
move.b -(a3),1(a3)
dbf d2,.decale_chars
.pas_decalage_un_seul_char:
.insertion_un_seul_char:
move.b d0,(a2)
add.w #1,d1 ; position du curseur +1 : mais ne sort jamais
.insertion_espace:
* cmp.w te_txtlen(a1),d1
* bne .curseur_pas_au_dela_texte ; condition jamais rencontrée
* sub.w #1,d1
* bset #2,d2 ; le curseur sort à gauche
*.curseur_pas_au_dela_texte
move.w d1,d0
clr.w d1
clr.w d2
cmp.w #4,d3
bne.s .pas_mode_speciale
move.w d4,d2
tst.w d2
beq.s .pas_de_caractere_sortie
bset #0,d1 ; caractère sortie à droite
.pas_de_caractere_sortie:
.pas_mode_speciale:
clr.w d7
rts
.pas_insertion_chars:
cmp.w #4,d3
bne.s .pas_insertion_chars2
.caractere_insere_sortie:
clr.w d2
move.b d0,d2 ; caractère sortie = caractère entré
move.w d1,d0 ; position curseur idem
clr.w d1
bset #0,d1 ; sortie caractère à droite
bset #2,d1 ; sortie curseur à gauche
clr.w d7
rts
.pas_insertion_chars2:
.chars_ne_correspond_pas:
.unknown_char:
move.w d1,d0
clr.w d1
clr.w d2
move.w #GWVA_ERROR_GENERIC,d7
rts
.compare_char_table_admissible
tst.b (a5)
beq.s .chars_ne_correspond_pas
cmp2.b (a5),d0
bcc .insere_chars
lea 1+1(a5),a5
bra.s .compare_char_table_admissible
.digit: lea .table_digit(pc),a5
bra .compare_char_table_admissible
.uppercase_letter:
lea .table_uppercase_letter(pc),a5
bra .compare_char_table_admissible
.upper_lowercase_letter:
lea .table_upper_lowercase_letter(pc),a5
bra .compare_char_table_admissible
.digit_uppercase_letter:
lea .table_digit_uppercase_letter(pc),a5
bra .compare_char_table_admissible
.digit_upper_lowercase_letter:
lea .table_digit_upper_lowercase_letter(pc),a5
bra .compare_char_table_admissible
.GEMDOS_name_1:
lea .table_GEMDOS_name_1(pc),a5
bra .compare_char_table_admissible
.GEMDOS_name_2:
lea .table_GEMDOS_name_2(pc),a5
bra .compare_char_table_admissible
.GEMDOS_pathname_1:
lea .table_GEMDOS_pathname_1(pc),a5
bra .compare_char_table_admissible
.GEMDOS_pathname_2:
lea .table_GEMDOS_pathname_2(pc),a5
bra .compare_char_table_admissible
.table_digit: dc.b '0','9',0
.table_uppercase_letter: dc.b ' ',' ','A','Z',0
.table_upper_lowercase_letter: dc.b ' ',' ','A','Z','a','z',0
.table_digit_uppercase_letter: dc.b ' ',' ','A','Z','0','9',0
.table_digit_upper_lowercase_letter: dc.b ' ',' ','A','Z','a','z','0','9',0
.table_GEMDOS_name_1: dc.b '!','-','0','[',']','~',0
.table_GEMDOS_name_2: dc.b '!',')','+','-','0','>','@','[',']','~',0
.table_GEMDOS_pathname_1: dc.b '!','-','0','~',0
.table_GEMDOS_pathname_2: dc.b '!',')','+','-','0','>','@','~',0
even